package com.lnsoft.cac.server.handle;

import com.lnsoft.cac.server.Entity.Command;
import com.lnsoft.cac.server.handle.codec.Device;
import io.netty.channel.group.ChannelGroup;
import io.netty.channel.group.DefaultChannelGroup;
import io.netty.util.concurrent.GlobalEventExecutor;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentLinkedQueue;

@Data
@Slf4j
@Component
public class CACGlobalData {
    @Value("${cag.cacDeviceID}")
    public String cacDeviceID;
    @Value("${cag.cacIP}")
    public String cacIP;
    @Value("${cag.cagWsUrl}")
    public String cagWsUrl;
    public final String cacTemperature = "15.00";
    public final ConcurrentLinkedQueue<String> voltageDataXml = new ConcurrentLinkedQueue();  //  装置主动周期上传的电压分钟数据
    public final ConcurrentLinkedQueue<String> voltageDayDataXml = new ConcurrentLinkedQueue();  //  装置主动周期上传的电压日统计数据
    public final ConcurrentLinkedQueue<String> voltageMonDataXml = new ConcurrentLinkedQueue();  //  装置主动周期上传的电压月统计数据
    public final ConcurrentLinkedQueue<String> configDataXml = new ConcurrentLinkedQueue();  //  装置返回的 查询配置相关的数据
    public final ConcurrentLinkedQueue<String> eventDataXml = new ConcurrentLinkedQueue();  //  装置报送的事件相关的数据
    public final Map<String, Device> deviceMap4Device = new ConcurrentHashMap<>();
    public static ChannelGroup channelGroup = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);

    //  线程池在此处全局初始化
    //  定时器 发送CAC心跳和Device心跳
    //  线程池中添加任务批量上传电压数据

//    public void addCommandTask(String deviceId, Command command) {
//        Device device = deviceMap4Device.get(deviceId);
//        if (device == null) {
//            return;
//        }
//        if (device.getCurrentCmd() == null) {
//            device.setCurrentCmd(command);
//        }
//        device.getCagCmdList().add(command);
//    }

    //  根据装置设备id获取帧序列号；返回值-1代表该设备不存在；
//    public int getFraSerNum4CAC(String device_id) {
//        Device device = deviceMap4Device.get(device_id);
//        if (device == null) {
//            return -1;
//        }
//        return device.getFraSerNum4CAC();
//    }
    //  webservice服务方法:
    //  1.上传心跳信息  uploadCACHeartbeatInfo
    //  2.上传数据    UploadCACData     ( 周期上传 电压数据；根据下发的控制指令，上传召唤的电压数据)(对应下发指令类型：GETDATA、GETDSTATDATA、GETMSTATDATA)
    //  3.上传配置信息  UploadCACConfig   (根据下发的控制指令，上传召唤的配置数据)(对应下发指令类型：GETCONFIG)
    //  4.下发控制指令  downloadCAGCtrl   (下发控制指令： 召唤电压数据、配置信息等数据，指令装置更新文件)
    //  5.获取更新文件  downloadCACUpdateFile     (根据下发的控制指令，向CAG获取更新文件)
    //  6.上传命令执行结果    uploadCtrlResult      (根据下发的控制指令，上送 设置配置信息指令的执行结果)(SETCONFIG)
    //  下发控制指令类型：GETCONFIG、SETCONFIG、GETDATA、GETDSTATDATA、GETMSTATSDATA、UPDATENOTICE、RESTART
}
